<?php
namespace app\common\library;

use think\cache\driver\Redis;

class HistoryManager
{
    /** @var Redis Redis实例 */
    private $redis;
    
    /** @var string 键名前缀 */
    private $keyPrefix = 'user_history:';
    
    /** @var int 最大记录数 */
    private $maxCount = 10; 
    
    /** @var int 过期时间（秒）：1天 */
    private $expireTime = 86400;

    public function __construct()
    {
        $this->redis = new Redis();
    }

    /**
     * 添加历史记录（带过期时间）
     * @param string $uid 用户ID
     * @param string $skey 关键词
     * @param int $stime 时间戳
     * @return bool
     */
    public function add(string $uid, string $skey, int $stime): bool
    {
        $key = $this->getKey($uid);
        
        // 1. 获取现有记录
        $historyJson = $this->redis->get($key);
        $history = $historyJson ? json_decode($historyJson, true) : [];
        
        // 2. 去重：移除重复关键词（保留最新）
        $history = array_filter($history, fn($item) => $item['skey'] !== $skey);
        
        // 3. 添加新记录到头部
        array_unshift($history, [
            'skey' => $skey,
            'stime' => $stime
        ]);
        
        // 4. 限制数量
        if (count($history) > $this->maxCount) {
            $history = array_slice($history, 0, $this->maxCount);
        }
        
        // 5. 存储并设置过期时间（通过set的第三个参数设置ttl）
        $setResult = $this->redis->set(
            $key,
            json_encode($history, JSON_UNESCAPED_UNICODE),
            $this->expireTime // 直接传递过期时间（秒）
        );
        
        return $setResult;
    }

    /**
     * 获取所有历史记录
     * @param string $uid 用户ID
     * @return array
     */
    public function getAll(string $uid): array
    {
        $key = $this->getKey($uid);
        $historyJson = $this->redis->get($key);
        return $historyJson ? json_decode($historyJson, true) : [];
    }

    /**
     * 删除指定关键词的记录
     * @param string $uid 用户ID
     * @param string $skey 关键词
     * @return bool
     */
    public function delete(string $uid, string $skey): bool
    {
        $key = $this->getKey($uid);
        $historyJson = $this->redis->get($key);
        
        if (!$historyJson) {
            return false; // 记录不存在
        }
        
        $history = json_decode($historyJson, true);
        $filtered = array_filter($history, fn($item) => $item['skey'] !== $skey);
        
        // 若删除后无记录，直接删除键
        if (empty($filtered)) {
            return $this->redis->rm($key);
        }
        
        // 重新存储剩余记录并更新过期时间
        $setResult = $this->redis->set(
            $key,
            json_encode($filtered, JSON_UNESCAPED_UNICODE),
            $this->expireTime // 重置过期时间
        );
        
        return $setResult;
    }

    /**
     * 清空历史记录
     * @param string $uid 用户ID
     * @return bool
     */
    public function clear(string $uid): bool
    {
        $key = $this->getKey($uid);
        return $this->redis->rm($key);
    }

    /**
     * 获取键名
     * @param string $uid
     * @return string
     */
    private function getKey(string $uid): string
    {
        return "{$this->keyPrefix}{$uid}";
    }
}